(ns clojure-simple-proxy.core
  (:import (java.util LinkedHashMap)))


;; 定义一个匿名类
;; 然后重新覆盖某些方法
(defn lru-cache
  ;; proxy方法实现是一个闭包 所有所有的参数都在函数中可用
  [max-size]
  ;; 第一个向量 超类 / 所实现的接口的名称 超类必须在前面
  ;; 提供构造函数的参数 注意 任何表达式都可以放在构造函数里面
  (proxy [LinkedHashMap] [16 0.75 true]
    ;; 隐含绑定this
    (removeEldestEntry [entry]
      (> (count this) max-size))))

#_(proxy [class-and-interface] [args] fs+)
;; class-and-interface 一个类名的向量集合
;; args 父类构造函数参数
;; fs+ 实现函数
;; f => (name [params*] body)
;; f => (name ([params*] body) ([params*] body) ... )
;;
;; 扩展类和接口,产生一个匿名类,并且分发相关函数
;; 接口名称必须是接口类型
;; 如果没有提供类的方法,那么父类方法将会被调用
;; 如果没有提供接口的方法,那么会产生UnsupportedOperationException
;; 每个方法会得到一个额外的第一个参数 this

#_(proxy proxy mappings)
;;
